package listNodePractice;

public class Class203 {

    public ListNode removeElements(ListNode head, int val) {
        //链表为空链表
        if (head==null){
            return null;
        }

//        链表只有一个节点
        if (head.next==null){
            if (head.val==val){
                return null;
            }
            else {
                return head;
            }
        }

//        大多数情况下  todo:我构造的是　一个当前节点和下一个节点
        ListNode dumpy=new ListNode(-1);
        ListNode cur=head;
        ListNode next=head.next;

        if (head.val==val){
            dumpy.next=cur.next;
            cur=cur.next;
        }
        else{
            dumpy.next=cur;

        }
        while (next!=null){
            if (next.val==val){
                cur.next=next.next;
                cur=next.next;
            }
            else{
                cur=next;
            }
            next=next.next;
        }

        return dumpy.next;
    }

    //todo:越来越觉得玄妙　　pre　相当于代理指针　当ｃｕｒ的值等于ｖａｌ的时候就将pre.next 指向cur.next
//    todo:                               当ｃｕｒ的值不等于val的时候就将pre 指向cur
    //todo:    cur指针就是原来的head链表不做变化

        public ListNode removeElements1(ListNode head, int val) {
        //todo:构造的是一个指向前一个节点的指针　　和一个当前节点的指针　　
            ListNode cur=head;
            ListNode fakeHead=new ListNode(-1);
            fakeHead.next=head;
            ListNode prev=fakeHead; //构造一个假结点
            while(cur!=null){
                if(cur.val==val){
                    prev.next=cur.next;
                }else{
                    prev=cur;
                }
                cur=cur.next;
            }
            return fakeHead.next;
        }




    public static void main(String[] args) {
        ListNode listNode1 = new ListNode(1);
        ListNode listNode2 = new ListNode(2);
        ListNode listNode3 = new ListNode(3);
        ListNode listNode4 = new ListNode(4);
        ListNode listNode5 = new ListNode(2);
        listNode1.next=listNode2;
        listNode2.next=listNode3;
        listNode3.next=listNode4;
        listNode4.next=listNode5;

        Class203 class203 = new Class203();
        ListNode listNode = class203.removeElements1(listNode1, 2);

        while (listNode!=null){
            System.out.println(listNode.val);
            listNode=listNode.next;
        }
    }
}
